/**
 * 计算机在处理加减运算时，使用补码进行运算，减法被视为加上一个负数，在处理负数时，用负数的补码进行加法可以即可得到正确运算结果，补码是为了统一加减运算而生的。
 * 0b0000000001111111110000000000000
 * 0b1111111110000000001111111111111
 * 0b1111111110000000010000000000000
 * @param {*} lanes
 * @returns
 */
function getHighestPriorityLane(lanes) {
  return lanes & -lanes;
}
function pickArbitraryLane(lanes) {
  return getHighestPriorityLane(lanes);
}

function pickArbitraryLaneIndex(lanes) {
  return 31 - clz32(lanes);
}

function laneToIndex(lane) {
  return pickArbitraryLaneIndex(lane);
}

function includesSomeLane(a, b) {
  return (a & b) !== NoLanes;
}
function isSubsetOfLanes(set, subset) {
  return (set & subset) === subset;
}
function mergeLanes(a, b) {
  return a | b;
}

/**
 * 0b0000000001111111110000000000000
 *
 *
 * @param {*} set
 * @param {*} subset
 * @returns
 */
function removeLanes(set, subset) {
  return set & ~subset;
}
function intersectLanes(a, b) {
  return a & b;
}

function laneToLanes(lane) {
  return lane;
}

function getLowestPriorityLane(lanes) {
  const index = 31 - Math.clz32(lanes);
  return index < 0 ? NoLanes : 1 << index;
}
